Merancang fondasi data aplikasi nyata — relasi, ERD, dan normalisasi — untuk membangun sistem yang rapi, cepat, dan tahan lama.
Kelas 10 SMK/SMA IT • Semester 2 • Tekan → untuk mulai
Setelah bab ini, kamu akan mampu merancang database aplikasi nyata dari nol.
Membedakan One-to-One, One-to-Many, dan Many-to-Many beserta contohnya.
Mengenal simbol & komponen ERD, lalu membacanya tanpa bantuan guru.
Mengidentifikasi 1NF, 2NF, dan 3NF pada sebuah tabel.
Membuat relasi User, Produk, Kategori, dan Transaksi.
Menyusun ERD E-Commerce dengan minimal 4 entitas.
Menyelesaikan 2 latihan interaktif + 1 tugas mandiri.
Bayangkan sebuah lemari arsip sekolah. Setiap laci punya tema: laci Siswa, laci Kelas, laci Nilai.
Database relational = banyak tabel (laci) yang saling terhubung. Tabel nilai tahu milik siswa siapa karena ada nomor identitas yang sama.
Penghubung itu namanya Key: Primary Key (PK) = identitas unik, Foreign Key (FK) = penunjuk ke tabel lain.
Analogi Nyata
| siswa_id (PK) | nama |
|---|---|
| 1 | Budi |
| 2 | Sari |
| nilai_id (PK) | siswa_id (FK) | nilai |
|---|---|---|
| 10 | 1 | 90 |
| 11 | 2 | 85 |
Satu data di tabel A hanya berpasangan dengan tepat satu data di tabel B.
Analogi: Orang ↔ KTP
1 orang punya tepat 1 KTP, dan 1 KTP dimiliki tepat 1 orang. ✨
👤 User ↔ 🪪 Profil Detail · 🏫 Sekolah ↔ 📍 Alamat Utama · 📱 HP ↔ 🔢 Nomor IMEI
Saat ingin memisahkan data sensitif/jarang dipakai dari tabel utama agar lebih ringan & rapi.
-- FK diberi UNIQUE → memaksa 1:1
CREATE TABLE users (
id INT PRIMARY KEY,
nama VARCHAR(100)
);
CREATE TABLE profil (
id INT PRIMARY KEY,
user_id INT UNIQUE, -- kunci 1:1
bio TEXT,
FOREIGN KEY(user_id) REFERENCES users(id)
);
ERD Visual
erDiagram
USERS ||--|| PROFIL : "memiliki"
USERS {
int id PK
string nama
}
PROFIL {
int id PK
int user_id FK
string bio
}
Simbol ||--|| berarti satu-dan-tepat-satu di kedua sisi.
Satu data di tabel A bisa berpasangan dengan banyak data di tabel B.
Analogi: Ibu → Banyak Anak
1 ibu bisa punya banyak anak — tapi tiap anak hanya punya 1 ibu. 👩👧👦
1 kategori berisi banyak produk.
1 user bisa membuat banyak pesanan.
1 postingan punya banyak komentar.
CREATE TABLE kategori (
id INT PRIMARY KEY,
nama VARCHAR(60)
);
CREATE TABLE produk (
id INT PRIMARY KEY,
nama VARCHAR(100),
kategori_id INT, -- FK, TANPA unique
FOREIGN KEY(kategori_id)
REFERENCES kategori(id)
);
ERD Visual
erDiagram
KATEGORI ||--o{ PRODUK : "punya banyak"
KATEGORI {
int id PK
string nama
}
PRODUK {
int id PK
string nama
int kategori_id FK
}
Simbol ||--o{ = satu sisi "1", sisi kaki-gagak "banyak". FK tanpa UNIQUE.
Banyak data A bisa terhubung ke banyak data B, dan sebaliknya.
Analogi: Siswa ↔ Mata Pelajaran
1 siswa ambil banyak mapel, & 1 mapel diambil banyak siswa. 🕸️
CREATE TABLE siswa ( id INT PRIMARY KEY, nama VARCHAR(80) );
CREATE TABLE mapel ( id INT PRIMARY KEY, nama VARCHAR(80) );
-- 🪡 TABEL JEMBATAN / PIVOT
CREATE TABLE siswa_mapel (
siswa_id INT,
mapel_id INT,
PRIMARY KEY(siswa_id, mapel_id),
FOREIGN KEY(siswa_id) REFERENCES siswa(id),
FOREIGN KEY(mapel_id) REFERENCES mapel(id)
);
Tabel Pivot: siswa_mapel
| siswa_id (FK) | mapel_id (FK) |
|---|---|
| 1 | 10 |
| 1 | 11 |
| 2 | 10 |
erDiagram
SISWA ||--o{ SISWA_MAPEL : ikut
MAPEL ||--o{ SISWA_MAPEL : diambil
ERD adalah peta dari database: menunjukkan entitas, atribut, dan relasinya.
Objek/benda yang disimpan, mis. User, Produk. Jadi nama tabel.
Sifat/kolom entitas, mis. nama, harga, email.
Atribut unik penanda identitas baris (ditandai PK).
Atribut penunjuk ke PK tabel lain (ditandai FK).
Menghubungkan 2 entitas yang berhubungan.
Simbol kaki-gagak: jumlah pasangan (1 atau banyak).
Kamus Simbol Kaki-Gagak (Crow's Foot)
Latihan Baca Bersama
erDiagram
USER ||--o{ PESANAN : membuat
PESANAN ||--|{ ITEM : berisi
PRODUK ||--o{ ITEM : muncul_di
USER {
int id PK
string nama
}
PESANAN {
int id PK
int user_id FK
}
📖 Dibaca: "Satu User membuat banyak Pesanan; setiap Pesanan berisi satu atau lebih Item; setiap Item menunjuk satu Produk."
Aturan: setiap sel berisi satu nilai — tidak ada daftar/kolom berulang.
❌ Belum 1NF
| id | nama | hobi |
|---|---|---|
| 1 | Budi | renang, coding, gitar |
| 2 | Sari | membaca, lari |
Kolom hobi menumpuk banyak nilai dalam 1 sel. Susah dicari & diurutkan.
✅ Sudah 1NF
| id | nama | hobi |
|---|---|---|
| 1 | Budi | renang |
| 1 | Budi | coding |
| 1 | Budi | gitar |
| 2 | Sari | membaca |
Tiap sel = satu nilai. Atomik & mudah diproses.
2NF — Hapus Ketergantungan Parsial
Syarat: sudah 1NF + setiap kolom non-key bergantung pada seluruh primary key (penting saat PK gabungan).
-- ❌ nama_produk ikut di tabel pivot
order_item(order_id, produk_id, nama_produk, qty)
-- ✅ pisahkan: nama_produk milik tabel produk
order_item(order_id, produk_id, qty)
produk(id, nama_produk)
3NF — Hapus Ketergantungan Transitif
Syarat: sudah 2NF + kolom non-key tidak bergantung pada kolom non-key lain.
-- ❌ nama_kota bergantung pada kode_pos
user(id, nama, kode_pos, nama_kota)
-- ✅ pisahkan ke tabel kota
user(id, nama, kode_pos)
kota(kode_pos, nama_kota)
🧑 Tabel users
| kolom | tipe | ket |
|---|---|---|
| id | INT | PK |
| nama | VARCHAR | — |
| VARCHAR | UNIQUE | |
| role | ENUM | user/admin |
📦 Tabel produk
| kolom | tipe | ket |
|---|---|---|
| id | INT | PK |
| nama | VARCHAR | — |
| harga | DECIMAL | — |
| kategori_id | INT | FK → kategori |
erDiagram
USERS ||--o{ PESANAN : membuat
KATEGORI ||--o{ PRODUK : mengelompokkan
USERS {
int id PK
string email
}
PRODUK {
int id PK
int kategori_id FK
}
🏷️ Tabel kategori
| kolom | tipe | ket |
|---|---|---|
| id | INT | PK |
| nama | VARCHAR | — |
1 kategori → banyak produk (1 : N).
🧾 Tabel transaksi (pesanan)
| kolom | tipe | ket |
|---|---|---|
| id | INT | PK |
| user_id | INT | FK → users |
| tanggal | DATE | — |
| total | DECIMAL | — |
Detail item disimpan di pivot transaksi_item (N : N produk).
erDiagram
USERS ||--o{ TRANSAKSI : melakukan
TRANSAKSI ||--|{ TRANSAKSI_ITEM : memuat
PRODUK ||--o{ TRANSAKSI_ITEM : terdapat_di
Kita gabungkan semua konsep menjadi satu rancangan database toko online.
Pembeli & admin. PK: id.
Pengelompokan produk. PK: id.
Barang dijual. FK: kategori_id.
Pesanan. FK: user_id.
Pivot N:N transaksi ↔ produk.
Ulasan. FK: user_id, produk_id.
erDiagram
USERS ||--o{ TRANSAKSI : melakukan
USERS ||--o{ REVIEW : menulis
KATEGORI ||--o{ PRODUK : memiliki
PRODUK ||--o{ REVIEW : menerima
TRANSAKSI ||--|{ TRANSAKSI_ITEM : memuat
PRODUK ||--o{ TRANSAKSI_ITEM : terjual_di
USERS {
int id PK
string nama
string email
}
KATEGORI {
int id PK
string nama
}
PRODUK {
int id PK
string nama
decimal harga
int kategori_id FK
}
TRANSAKSI {
int id PK
int user_id FK
date tanggal
}
TRANSAKSI_ITEM {
int transaksi_id FK
int produk_id FK
int qty
}
REVIEW {
int id PK
int user_id FK
int produk_id FK
int rating
}
Mengandung 1:N (kategori→produk) dan N:N (transaksi↔produk via pivot). ✅
Pilih jawaban yang benar. Klik salah satu opsi.
Soal 1: Dalam sistem sekolah, 1 Kelas berisi banyak Siswa, dan tiap Siswa hanya berada di 1 Kelas. Relasi ini adalah…
Soal 2: Penulis dan Buku — 1 penulis bisa menulis banyak buku, dan 1 buku bisa ditulis banyak penulis. Relasi ini butuh…
Pilih jenis relasi yang tepat dari tiap dropdown, lalu tekan Periksa Jawaban.
Rancang ERD untuk sistem peminjaman buku perpustakaan sekolah.
📋 Instruksi
🧩 Template Awal (lengkapi!)
erDiagram
ANGGOTA ||--o{ PEMINJAMAN : "meminjam"
BUKU ||--o{ PEMINJAMAN : "dipinjam"
KATEGORI ||--o{ BUKU : "________"
-- lengkapi atribut & relasi lainnya
ANGGOTA { int id PK
string nama }
BUKU { int id PK
int kategori_id FK }
Kumpulkan: file .mmd / foto ERD + penjelasan 1 paragraf.
1:1 (Orang↔KTP), 1:N (Ibu→Anak), N:N (Siswa↔Mapel + pivot).
Entitas, atribut, PK/FK, dan kardinalitas kaki-gagak.
1NF atomik · 2NF parsial · 3NF transitif — satu fakta satu kali.
💡 Tips Senior: Sebelum menulis kode, gambar dulu ERD-nya. Database yang dirancang rapi = aplikasi yang mudah dikembangkan dan jarang bug data.
Lanjut ke BAB 8 — implementasi query & API. Tekan ← untuk mengulang materi.